import java.util.HashMap;
import java.util.Map;

public class LeetCode387 {
    public static int firstUniqChar(String s) {
        int [] freq = new int[26];

        for (int i = 0; i < s.length(); i++){
            freq[s.charAt(i) - 'a']++;
        }
        for (int i = 0; i < s.length(); i++) {
            if (freq[s.charAt(i) - 'a'] == 1){
                return i;
            }
        }
        return -1;
    }

    public static void main(String[] args) {
        int result = firstUniqChar("leetcode");
        System.out.println(result);
    }


}

class Solution {

    /**
     * 找到字符串中第一个不重复的字符，并返回其索引。
     * 如果字符串中不存在不重复的字符，则返回-1。
     * 使用HashMap来统计每个字符出现的次数，然后遍历字符串找到第一个出现次数为1的字符。
     *
     * @param s 输入的字符串
     * @return 第一个不重复字符的索引，如果不存在则返回-1
     */
    public int firstUniqChar_1(String s) {
        // 初始化一个HashMap来存储字符和它们出现的次数
        Map<Character, Integer> map = new HashMap<>(26);

        // 将字符串转换为字符数组，方便遍历
        char[] chars = s.toCharArray();

        // 遍历字符数组，统计每个字符出现的次数
        for (char ch : chars) {
            // Map.getOrDefault(Object key, V defaultValue)方法的作用是：
            // 当Map集合中有这个key时，就使用这个key值；
            // 如果没有就使用默认值defaultValue。
            // 如果字符已经存在，则更新它的出现次数；如果不存在，则添加到HashMap中，并设置出现次数为1
            map.put(ch, map.getOrDefault(ch, 0) + 1);
        }

        // 再次遍历字符数组，寻找第一个出现次数为1的字符
        for (int i = 0; i < chars.length; i++) {
            // 如果当前字符的出现次数为1，则返回其索引
            if (map.get(chars[i]) == 1) {
                return i;
            }
        }

        // 如果没有找到不重复的字符，则返回-1
        return -1;
    }


    public int firstUniqChar_2(String s) {
        int[] freq = new int[26];
        char[] chars = s.toCharArray();
        for (char ch : chars) {
            freq[ch - 'a']++;
        }
        for (int i = 0; i < chars.length; i++) {
            if (freq[chars[i] - 'a'] == 1) {
                return i;
            }
        }
        return -1;
    }

    public int firstUniqChar_3(String s) {
        for (int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i);
            if (s.indexOf(ch) == s.lastIndexOf(ch)) {
                return i;
            }
        }
        return -1;
    }

    public int firstUniqChar_4(String s) {
        boolean[] notUniq = new boolean[26];
        for (int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i);
            if (!notUniq[ch -'a']) {
                if (s.indexOf(ch) == s.lastIndexOf(ch)) {
                    return i;
                } else {
                    notUniq[ch - 'a'] = true;
                }
            }
        }
        return -1;
    }

    public int firstUniqChar(String s) {
        int res = -1;
        for (char ch = 'a'; ch <= 'z'; ch++) {
            int index = s.indexOf(ch);
            if (index != -1 && index == s.lastIndexOf(ch)) {
                res = (res == -1 || res > index) ? index : res;
            }
        }
        return res;
    }
}
